package ar.com.javacuriosities.networking.tcp.rmi; import java.rmi.AlreadyBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; /* * RMI (Remote Method Invocation) es la forma que nos ofrece Java para conectar dos * aplicaciones Java que están en distinto procesos incluso distintos ordenadores. * * Cuando hablamos de IPC (Inter-Process Communication) es muy común escuchar RPC (Remote Procedure Call), * el cual es una forma para comunicar procesos por medio de una red, RMI seria similar pero basado para Java * y además de invocar un procedimiento podemos obtener objetos o sea es mas object oriented. * * RMI se base en TCP/IP pero oculta la capa de comunicación al usuario * RMI utiliza Serialization para la comunicación entre los procesos * * El puerto por default de RMI es 1099, del lado servidor tenemos que levantar el registry, * esto se puede hacer por línea de comandos o desde la app, si lo hacemos por línea de comandos * es importante que antes de iniciar el registry el classpath este bien configurado para poder exponer * nuestros objetos. * * * export CLASSPATH="<Server Classpath>" * rmiregistry & */ public class Server { public static void main(String args[]) { try { // En nuestro ejemplo, creamos el registry desde la app para que ya tome nuestro classpath LocateRegistry.createRegistry(1099); // Creamos el servicio a exportar HelloService serviceImpl = new HelloServiceImpl(); /* * Usamos UnicastRemoteObject para exportar el objeto que deseamos, esto se encargara de crear * las clases stub y skeleton que se encargan de la comunicación, hasta antes de Java 1.5 era necesario * ejecutar rmic sobre la implementación del servicio para generar estas clases. * * Stub: Es la representación del lado cliente * Skeleton: Es la representación del lado server */ HelloService skeleton = (HelloService) UnicastRemoteObject.exportObject(serviceImpl, 0); // Obtenemos el registry Registry registry = LocateRegistry.getRegistry(); // Hacemos el binding entre un nombre y el objeto del lado server registry.bind(HelloService.class.getName(), skeleton); System.out.println("Server is up and running"); } catch (RemoteException | AlreadyBoundException e) { // Log and Handle exception e.printStackTrace(); } } }